package com.imedical.strategy;

import com.imedical.entity.RequestDetail;
import com.imedical.exception.DataException;

import org.springframework.stereotype.Service;

import java.util.Map;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.webservice.SoapClient;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 请求WebService服务服务
 * 格式类似http://192.178.61.90:8020/ReceiveData.asmx@RmisMedicalRecordsArchive@http://temp.org/
 * http://xxx.asmx@方法名@命名空间
 *
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2022/1/19
 */
@Slf4j
@Service
public class SendWebServiceRequestStrategy implements SendRequestStrategy {

    @Override
    public Object sendRequest(RequestDetail requestDetail) {
        String[] split = StrUtil.splitToArray(requestDetail.getUrl(), "@");
        if (split == null || split.length < 3) {
            throw new DataException("配置的请求地址有误,请检查管理系统中配置的地址信息,相应格式为：【http://xxx.asmx@方法名@命名空间】");
        }
        SoapClient client = SoapClient.create(split[0])
                // 设置要请求的方法，此接口方法前缀为web，传入对应的命名空间
                .setMethod("web:" + split[1], split[2]);

        Map<String, Object> param = MapUtil.newHashMap();
        if (JSONUtil.isJson(requestDetail.getParam())) {
            JSONObject parseObj = JSONUtil.parseObj(requestDetail.getParam());
            parseObj.forEach(param::put);
        } else {
            throw new DataException("参数格式不支持，仅支持格式Json对象");
        }
        client.setParams(param);
        // 发送请求，参数true表示返回一个格式化后的XML内容
        return client.send(true);
    }

}
